     /*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.brain.prod.mbean;

import com.brain.core.exception.DAOException;
import com.brain.core.manager.BitacoraManager;
import com.brain.core.manager.RecursosManager;
import com.brain.core.view.mbean.ApplicationMBean;
import com.brain.core.view.mbean.ArchivoMBean;
import com.brain.core.view.mbean.GenericMBean;
import com.brain.core.view.mbean.SessionMBean;
import com.brain.prod.dto.ControlCriticoDto;
import com.brain.prod.dto.ControlCriticoPuntoDto;
import com.brain.prod.dto.ControlCriticoTurnoDto;
import com.brain.prod.manager.ControlCriticoManager;
import com.brain.prod.manager.ControlCriticoPuntoManager;
import com.brain.prod.manager.ControlCriticoTurnoManager;
import java.io.Serializable;
import java.util.List;
import javax.annotation.Resource;
import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;
import org.apache.log4j.Logger;
import org.primefaces.context.RequestContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

/**
 * @author Greip Company
 * @since 09/01/2014
 * @version 1.0
 */
@Controller("controlCriticoMBean")
@Scope("session")
public class ControlCriticoMBean extends GenericMBean implements Serializable {
    
    /**
     * Logger permite registrar los errores que ocurren
     * @since 09/01/2014
     */
    private static Logger logger = Logger.getLogger(ControlCriticoMBean.class);
    
    /**
     * ControlCriticoManager encapsula la lógica de negocio
     * @since 09/01/2014
     */
    @Resource
    private ControlCriticoManager manager;
    
    /**
     * ControlCriticoPuntoManager encapsula la lógica de negocio
     * @since 09/01/2014
     */
    @Resource
    private ControlCriticoPuntoManager puntoManager;
    
    /**
     * ControlCriticoTurnoManager encapsula la lógica de negocio
     * @since 09/01/2014
     */
    @Resource
    private ControlCriticoTurnoManager turnoManager;
    
    /**
     * applicationMBean permite obtener diferentes valores de la aplicación, como acciones y estilos
     * @since 09/01/2014
     */
    @Autowired
    private ApplicationMBean applicationMBean;
    
    /**
     * sessionMBean mentiene datos el usuario en sesión
     * @since 09/01/2014
     */
    @Autowired
    private SessionMBean sessionMBean;
    
    /**
     * recursosManager permite mostrar mensajes en las vistas
     * @since 09/01/2014
     */
    @Resource
    private RecursosManager recursosManager;
    
    /**
     * bitacoraManager permite mostrar el historial de acciones realizadas sobre la entidad
     * @since 09/01/2014
     */
    @Resource
    private BitacoraManager bitacoraManager;   
    
    /**
     * archivoMBean permite guardar archivos
     * @since 09/01/2014
     */
    @Resource
    private ArchivoMBean archivoMBean;
    
    /**
     * lista listado de entidades ControlCriticoDto usado en la vista listaControlCritico.xhtml
     * @since 09/01/2014
     */
    private List<ControlCriticoDto> lista;
    
    /**
     * dto entidad usada para almacenar los datos en la vista controlCritico.xhtml
     * @since 09/01/2014
     */
    private ControlCriticoDto dto;
    
    /**
     * dtoFiltro entidad usara para almacenar los campos filtro en la vista listaControlCritico.xhtml
     * @since 09/01/2014
     */
    private ControlCriticoDto dtoFiltro;
    
    /**
     * detaPuntoDto entidad usada para almacenar los datos de la vista controlCriticoPunto.xhtml
     * @since 09/01/2014
     */
    private ControlCriticoPuntoDto detaPuntoDto;
    
    /**
     * detaTurnoDto entidad usada para almacenar los datos de la vista controlCriticoTurno.xhtml
     * @since 09/01/2014
     */
    private ControlCriticoTurnoDto detaTurnoDto;
    
    /**
     * keyTitulo variable usada para construir el título de la vista controlCritico.xhtml
     * @since 09/01/2014
     */
    private String keyTitulo = "form.control.critico.panel";
    
    /**
     * keyDetalle variable usada para construir el título de los detalles
     * @since 09/01/2014
     */
    private String keyDetalle = "key.entidad.control.critico";
    
    /**
     * tituloDetalle variable que almacena el título de los detalles
     * @since 09/01/2014
     */
    private String tituloDetalle;
    
    /**
     * listaTiposValor variable usada en el combo tipoValor en la vista controlCriticoPunto.xhtml
     * @since 09/01/2014
     */
    private SelectItem[] listaTiposValor;
    
    /**
     * listaTurnos variable usada en el combo turnos en la vista controlCriticoTurno.xhtml
     * @since 09/01/2014
     */    
    private SelectItem[] listaTurnos;

    /**
     * Método iniciar ejecutado al seleccionar la opcion Control Critico en el menú principal
     * @since 09/01/2014
     * @return retorna la dirección de la vista listaControlCritico.xhtml
     */
    public String iniciar() {
        this.dtoFiltro = new ControlCriticoDto();
        this.dtoFiltro.setDescripcion("");
        this.dtoFiltro.setDescripcionCorta("");        
        this.lista = null;
        return this.manager.getUrlLista();
    }

    /**
     * Método buscar obtiene un listado de entidades ControlCriticoDto basándose en un filtro
     * @since 09/01/2014
     * @param ae por defecto null
     */
    public void buscar(ActionEvent ae) {
        try {
            this.lista = this.manager.obtenerControlCritico(this.dtoFiltro);
        } catch (DAOException ex) {
            logger.error(ex);
        }
    }  

    /**
     * Método nuevo inicializa las entidades ControlCriticoDto, ControlCriticoPuntoDto y ControlCriticoTurnoDto
     * @since 09/01/2014
     * @return retorna la dirección de la vista controlCritico.xhtml
     */
    public String nuevo() {
        sessionMBean.setAccion(applicationMBean.getNuevo());
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyTitulo, sessionMBean.getAccion()));
        this.dto = this.manager.inicializar();
        this.detaPuntoDto = this.puntoManager.inicializar();
        this.detaTurnoDto = this.turnoManager.inicializar();
        return this.manager.getUrl();
    }
    
    /*
     * Método nuevoPunto inicializa la entidad ControlCriticoPuntoDto y asigna a ControlCriticoPuntoDto la entidad ControlCriticoDto
     * @since 09/01/2014
     */
    public void nuevoPunto() {
        sessionMBean.setAccionDetalle(applicationMBean.getNuevo());
        this.tituloDetalle = recursosManager.construirTitulo(keyDetalle, sessionMBean.getAccionDetalle());
        this.detaPuntoDto = this.puntoManager.inicializar();
        this.detaPuntoDto.setControlCriticoDto(this.dto);
    }
    
    /**
     * Método nuevoTurno inicializa la entidad ControlCriticoTurnoDto y asigna a ControlCriticoTurno la entidad ControlCriticoDto
     * @since 09/01/2014
     */
    public void nuevoTurno() {
        sessionMBean.setAccionDetalle(applicationMBean.getNuevo());
        this.tituloDetalle = recursosManager.construirTitulo(keyDetalle, sessionMBean.getAccionDetalle());
        this.detaTurnoDto = this.turnoManager.inicializar();
        this.detaTurnoDto.setControlCriticoDto(this.dto);
    }

    /**
     * Método editar inicializa las entidades ControlCriticoPuntoDto y ControlCriticoTurnoDto. Setea la acción a editar
     * @since 09/01/2014
     * @return retorna la dirección de la vista controlCritico.xhtml
     */
    public String editar() {
        sessionMBean.setAccion(applicationMBean.getEditar());
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyTitulo, sessionMBean.getAccion()));
        this.detaPuntoDto = this.puntoManager.inicializar();
        this.detaTurnoDto = this.turnoManager.inicializar();
        return this.manager.getUrl();
    }
    
    /**
     * Método editarPunto setea la accionDetalle a editar y obtiene la entidad ControlCriticoPuntoDto
     * @since 09/01/2014
     */
    public void editarPunto() {
        sessionMBean.setAccionDetalle(applicationMBean.getEditar());
        this.tituloDetalle = recursosManager.construirTitulo(keyDetalle, sessionMBean.getAccionDetalle());
        if (this.detaPuntoDto.getId() != null) {
            try {
                this.detaPuntoDto = this.puntoManager.obtenerPorId(this.detaPuntoDto.getId());
            } catch (DAOException e) {
                showError(e.getMessage());
                logger.error(e);
            }
        }
    }
    
    /**
     * Método editarTurno setea la accionDetalle a editar y obtiene la entidad ControlCriticoTurnoDto
     * @since 09/01/2014
     */
    public void editarTurno() {
        sessionMBean.setAccionDetalle(applicationMBean.getEditar());
        this.tituloDetalle = recursosManager.construirTitulo(keyDetalle, sessionMBean.getAccionDetalle());
        if (this.detaTurnoDto.getId() != null) {
            try {
                this.detaTurnoDto = this.turnoManager.obtenerPorId(this.detaTurnoDto.getId());
            } catch (DAOException e) {
                showError(e.getMessage());
                logger.error(e);
            }
        }
    }

    /**
     * Método que inicializa las entidades ControlCriticoPuntoDto, ControlCriticoTurnoDto. Setea la acción a ver
     * @since 09/01/2014
     * @return retorna la dirección de la vista controlCritico.xhtml
     */
    public String ver() {
        sessionMBean.setAccion(applicationMBean.getVer());
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyTitulo, sessionMBean.getAccion()));
        this.detaPuntoDto = this.puntoManager.inicializar();
        this.detaTurnoDto = this.turnoManager.inicializar();
        return this.manager.getUrl();
    }
    
    /**
     * Método verPunto setea la accionDetalle a ver y obtiene la entidad ControlPuntoCriticoDto
     * @since 09/01/2014
     */
    public void verPunto() {
        sessionMBean.setAccionDetalle(applicationMBean.getVer());
        this.tituloDetalle = recursosManager.construirTitulo(keyDetalle, sessionMBean.getAccionDetalle());
        if (this.detaPuntoDto.getId() != null) {
            try {
                this.detaPuntoDto = this.puntoManager.obtenerPorId(this.detaPuntoDto.getId());
            } catch (DAOException e) {
                showError(e.getMessage());
                logger.error(e);
            }
        }
    }
    
    /**
     * Método verTurno setea la accionDetalle a ver y obtiene la entidad ControlCriticoTurnoDto
     * @since 09/01/2014
     */
    public void verTurno() {
        sessionMBean.setAccionDetalle(applicationMBean.getVer());
        this.tituloDetalle = recursosManager.construirTitulo(keyDetalle, sessionMBean.getAccionDetalle());
        if (this.detaTurnoDto.getId() != null) {
            try {
                this.detaTurnoDto = turnoManager.obtenerPorId(this.detaTurnoDto.getId());
            } catch (DAOException e) {
                showError(e.getMessage());
                logger.error(e);
            }
        }
    }
    
    /**
     * Método guardar permite guardar la entidad ControlCriticoDto
     * @since 09/01/2014
     * @return retorna la dirección de la vista controlCritico.xhtml. En caso de que no se haya guardado, retorna null
     */
    public String guardar() {        
        if (this.manager.guardar(this.dto) != null) {            
            this.editar();
        }        
        return null;
    }
    
    /**
     * Método guardarPunto permite guardar la entidad ControlCriticoPuntoDto. También obtiene la entidad ControlCriticoDto
     * @since 09/01/2014
     */
    public void guardarPunto() {
        RequestContext context = RequestContext.getCurrentInstance();
        boolean resultado = true;        
        try {
            if (this.puntoManager.guardar(this.detaPuntoDto) != null) {
                this.dto = this.manager.obtenerPorId(this.dto.getId());                    
            }
            else {
                resultado = false;
            }
        } catch (DAOException ex) {
            showError("ERROR_SISTEMA", ex.getMessage());
            logger.error(ex);
        }
        
        context.addCallbackParam("CallbackParam", resultado);
    }
    
    /**
     * Método guardarTurno permite guardar la entidad ControlCriticoTurnoDto. También obtiene la entidad ControlCriticoDto
     * @since 09/01/2014
     */
    public void guardarTurno() {
        RequestContext context = RequestContext.getCurrentInstance();
        boolean resultado = true;        
        try {
            if (this.turnoManager.guardar(this.detaTurnoDto) != null) {
                this.dto = this.manager.obtenerPorId(this.dto.getId());                    
            }
            else {
                resultado = false;
            }
        } catch (DAOException ex) {
            showError("ERROR_SISTEMA", ex.getMessage());
            logger.error(ex);
        }
        
        context.addCallbackParam("CallbackParam", resultado);
    }
    
    /**
     * Método verBitacore muestra el historial de acciones realizadas sobre la entidad ControlCriticoDto
     * @since 09/01/2014
     * @return retorna null
     */    
    public String verBitacora() {
        bitacoraManager.cargarBitacoraEntidad(manager.getIdEntidad(), this.dto.getId());
        return null;
    }

    /**
     * Método retroceder muestra el listado de la entidad ControlCriticoDto
     * @return retorna la dirección de la vista listaControlCritico.xhtml
     */    
    public String retroceder() {
        buscar(null);
        return this.manager.getUrlLista();
    }

    public ApplicationMBean getApplicationMBean() {
        return applicationMBean;
    }

    public void setApplicationMBean(ApplicationMBean applicationMBean) {
        this.applicationMBean = applicationMBean;
    }

    public ControlCriticoDto getDto() {
        return dto;
    }

    public void setDto(ControlCriticoDto dto) {
        this.dto = dto;
    }

    public ControlCriticoDto getDtoFiltro() {
        return dtoFiltro;
    }

    public void setDtoFiltro(ControlCriticoDto dtoFiltro) {
        this.dtoFiltro = dtoFiltro;
    }

    public String getKeyTitulo() {
        return keyTitulo;
    }

    public void setKeyTitulo(String keyTitulo) {
        this.keyTitulo = keyTitulo;
    }

    public List<ControlCriticoDto> getLista() {
        return lista;
    }

    public void setLista(List<ControlCriticoDto> lista) {
        this.lista = lista;
    }

    public static Logger getLogger() {
        return logger;
    }

    public static void setLogger(Logger logger) {
        ControlCriticoMBean.logger = logger;
    }  

    public RecursosManager getRecursosManager() {
        return recursosManager;
    }

    public void setRecursosManager(RecursosManager recursosManager) {
        this.recursosManager = recursosManager;
    }

    public SessionMBean getSessionMBean() {
        return sessionMBean;
    }

    public void setSessionMBean(SessionMBean sessionMBean) {
        this.sessionMBean = sessionMBean;
    }
    
    public ArchivoMBean getArchivoMBean() {
        return archivoMBean;
    }

    public void setArchivoMBean(ArchivoMBean archivoMBean) {
        this.archivoMBean = archivoMBean;
    }

    public ControlCriticoManager getManager() {
        return manager;
    }

    public void setManager(ControlCriticoManager manager) {
        this.manager = manager;
    }

    public BitacoraManager getBitacoraManager() {
        return bitacoraManager;
    }

    public void setBitacoraManager(BitacoraManager bitacoraManager) {
        this.bitacoraManager = bitacoraManager;
    }

    public String getTituloDetalle() {
        return tituloDetalle;
    }

    public void setTituloDetalle(String tituloDetalle) {
        this.tituloDetalle = tituloDetalle;
    }

    public ControlCriticoPuntoDto getDetaPuntoDto() {
        return detaPuntoDto;
    }

    public void setDetaPuntoDto(ControlCriticoPuntoDto detaPuntoDto) {
        this.detaPuntoDto = detaPuntoDto;
    }

    public ControlCriticoTurnoDto getDetaTurnoDto() {
        return detaTurnoDto;
    }

    public void setDetaTurnoDto(ControlCriticoTurnoDto detaTurnoDto) {
        this.detaTurnoDto = detaTurnoDto;
    }

    public ControlCriticoPuntoManager getPuntoManager() {
        return puntoManager;
    }

    public void setPuntoManager(ControlCriticoPuntoManager puntoManager) {
        this.puntoManager = puntoManager;
    }

    public ControlCriticoTurnoManager getTurnoManager() {
        return turnoManager;
    }

    public void setTurnoManager(ControlCriticoTurnoManager turnoManager) {
        this.turnoManager = turnoManager;
    }

    public SelectItem[] getListaTiposValor() {
        this.listaTiposValor = puntoManager.getTiposValor();
        return this.listaTiposValor;
    }

    public void setListaTiposValor(SelectItem[] listaTiposValor) {
        this.listaTiposValor = listaTiposValor;
    }

    /**
     * Método SelectItem carga el combo listaTurnos
     * @since 09/01/2014
     * @return retorna el combo listaTurnos
     */
    public SelectItem[] getListaTurnos() {
        this.listaTurnos = turnoManager.getListaTurnos();
        return this.listaTurnos;
    }

    public void setListaTurnos(SelectItem[] listaTurnos) {
        this.listaTurnos = listaTurnos;
    }
}
